package cloud.seri.iot.common.api

import cloud.seri.iot.common.model.CreateProductDTO
import cloud.seri.iot.common.model.ListProductByTagsDTO
import cloud.seri.iot.common.model.PageRequestDTO
import cloud.seri.iot.common.model.UpdateProductDTO
import com.aliyuncs.iot.model.v20180120.*


/**
 * 产品管理相关 API
API	描述
CreateProduct	创建产品。
UpdateProduct	修改产品信息。
QueryProductList	查询产品列表。
QueryProduct	查询产品详细信息。
DeleteProduct	删除指定产品。
CreateProductTags	创建产品标签。
UpdateProductTags	更新产品标签。
DeleteProductTags	删除产品标签。
ListProductTags	查询产品的所有标签。
ListProductByTags	根据标签查询产品。
 */
interface ProductManager
{
    /**
     * 新建产品
     * @param dto CreateProductDTO
     * @return CreateProductResponse?
     */
    fun createProduct(dto: CreateProductDTO): CreateProductResponse?

    /**
     * 查询产品详细信息。
     * @param pk String
     * @return QueryProductResponse?
     */
    fun queryProduct(pk: String): QueryProductResponse?

    /**
     * 查询产品列表
     * @param dto PageRequestDTO
     * @return QueryProductListResponse?
     */
    fun queryProductList(dto: PageRequestDTO): QueryProductListResponse?

    /**
     * 修改产品信息
     * @param dto UpdateProductDTO
     * @return UpdateProductResponse?
     */
    fun updateProduct(dto: UpdateProductDTO): UpdateProductResponse?

    /**
     * 创建产品标签
     * @param pk String 产品Key，物联网平台为产品颁发的唯一标识。
     * @param tags List<String> 要创建的标签。标签包括TagKey和TagValue，分别对应标签的key和value。
     * @return CreateProductTagsResponse?
     */
    fun createProductTags(pk: String, tags: List<CreateProductTagsRequest.ProductTag>): CreateProductTagsResponse?

    /**
     * 删除指定产品
     * @param pk String
     * @return DeleteProductResponse?
     */
    fun deleteProduct(pk: String): DeleteProductResponse?

    /**
     *
     * @param pk String
     * @param tags List<String>
     * @return DeleteProductTagsResponse?
     */
    fun deleteProductTags(pk: String, tags: List<String>): DeleteProductTagsResponse?

    /**
     *
     * @param tags List<String>
     * @param dto PageRequestDTO
     * @return ListProductByTagsResponse?
     */
    fun listProductByTags(dto: ListProductByTagsDTO): ListProductByTagsResponse?

    /**
     *
     * @param pk String
     * @return ListProductTagsResponse?
     */
    fun listProductTags(pk: String): ListProductTagsResponse?

    /**
     *
     * @param pk String
     * @param tags List<String>
     * @return UpdateProductTagsResponse?
     */
    fun updateProductTags(pk: String, tags: List<UpdateProductTagsRequest.ProductTag>): UpdateProductTagsResponse?
}

